package maquina.interfaz.usuario;


import java.awt.Color;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

import maquina.modelol.elector.Candidato;


/**
 * Interfaz de usuario. Presenta las diferentes vistas de una votacion completa 
 * 
 * @author Tuki
 *
 * 
 */
public class InterfazUsuario{

	private static String FALLA_CARGA = "Fatal_Error.jpg";	
	private static String FALLA_LECTOR = "Fatal_Error_Lector.jpg";	
	private static String CONFIRMAR = "flecha-derecha.jpg";	
	
	private JFrame f;
	private Map<Integer, Vector<JButton>> candidatos = new HashMap<Integer, Vector<JButton>>();
	private int paginaActual = 0;
	private Border bordeNoSeleccionado = new LineBorder(Color.blue, 1);
	private Border bordeSeleccionado = new LineBorder(Color.red, 6);
	private JPanel pListener;
	private JButton confirmar, ingreseTarjeta;

	public InterfazUsuario() {
		
		f = new JFrame();
		pListener = new JPanel();
		pListener.setFocusable(true);
		f.getContentPane().add(pListener); 
		f.getContentPane().setLayout(null);
        f.setSize(1024, 900);
        f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.validate();
	}

	/**
	 * Devuelve panel listener 
	 * 
	 * @return JPanel panel listener 
	 * */
	public JPanel getPanel(){
		
		return this.pListener;
		
	} 
	
	/**
	 * Carga vista de una determinada categoria
	 * 
	 * @param temp listado de candidatos de una categoria determinada
	 * 
	 * */
	
	public void inicCandidatos(List<List<Candidato>> model){
		 
		inicComponentesDeInteraccion();
			
           /*Carga vista de presentacion de cada categoria*/
		
		for(int i = 0;i < model.size(); i++){
                
			cargarVistaCandidatos(i,model.get(i));
        }
        
		f.validate();
		f.repaint();

	}
	
	
	private void cargarVistaCandidatos(int page, List<Candidato> temp) {
		
		candidatos.put(page, new Vector<JButton>());
        
		int X = 10;
		int Y = 10;
		int candidatoAct = 0;
		
		while (candidatoAct < temp.size()) 
		   {
			Candidato candidato = temp.get(candidatoAct);
			
			JButton nuevoCandidato = null;
			
			if(candidato.getRutaImagen() != null){
				
				nuevoCandidato = new JButton(candidato.getNombre(),new ImageIcon(candidato.getRutaImagen()));
			}
			else{
				nuevoCandidato = new JButton(candidato.getNombre());
			}
			
			nuevoCandidato.setBorder(bordeNoSeleccionado);
			nuevoCandidato.setBounds(X, Y, 165, 250);
            f.add(nuevoCandidato);
            nuevoCandidato.setVisible(false);
			
            candidatos.get(page).add(nuevoCandidato);
            
			/*tres fila de tres candidatos cada una*/
			if ((candidatos.get(page).size() == 3)
					|| (candidatos.get(page).size() == 6)) {
				Y = Y + 260;
				X = 10;
			} else if (candidatos.get(page).size() == 9) {
				Y = 10;
				X = 10;
			} else
				X = X + 170;
			candidatoAct++;
		}
	}
	
	/**
	 * Inicializa botones de ingreso de tarjeta y confirmacion de seleccion
	 * 
	 * */
private void inicComponentesDeInteraccion(){
	
	ingreseTarjeta = new JButton("Ingrese Tarjeta");
	Border bIngrese = new LineBorder(Color.black, 12);
	ingreseTarjeta.setBorder(bIngrese);
	ingreseTarjeta.setBounds(10, 10, 778, 778);
	f.add(ingreseTarjeta);
	
	confirmar = new JButton("CONFIRMAR",new ImageIcon(CONFIRMAR));
	Border bConfirmar = new LineBorder(Color.GREEN, 3);
	confirmar.setBorder(bConfirmar);
	confirmar.setBounds(520, 10, 150, 778);
	f.add(confirmar);
}

/**
 * Observa actualizaciones en el modelo
 * 
 * */


public void seleccionar(int candidato)
{
	
	JButton boton = candidatos.get(paginaActual).get(candidato - 1);
	
	 boton.setBorder(bordeSeleccionado);// selecciona candidato
	 
	 f.validate();
}

public void desSeleccionar(int candidato)
{
	JButton boton = candidatos.get(paginaActual).get(candidato - 1);
	
	 boton.setBorder(bordeNoSeleccionado);// selecciona candidato
	 
	 f.validate();
}

	
/**
 * presenta vista de nueva votacion
 * 
 * */
	public void iniciarNuevaVotacion() {
		
		paginaActual = 0;
		
		for(Integer pos : candidatos.keySet()){
			
			List<JButton> botones = candidatos.get(pos);
			
			for(JButton boton : botones){
				
				boton.setBorder(bordeNoSeleccionado);
				boton.setVisible(true);
			}
		}
		
		confirmar.setVisible(true);
		ingreseTarjeta.setVisible(false);
		f.validate();
		f.repaint();

	}
/**
 * presenta vista de espera nueva tarjeta
 * */
	public void presentarEsperaTarjeta() {
		
		cambiarVisibilidadPagina(paginaActual, false);
		confirmar.setVisible(false);
		ingreseTarjeta.setVisible(true);
		
		f.validate();
		f.repaint();
	}

	/**
	 *Si la pagina de candidatos esta visible la oculta y en caso contrario la muestra 
	 * */
	private void cambiarVisibilidadPagina(int pagina,boolean visibilidad){
		
		List<JButton> botones = candidatos.get(pagina);
		
		for(JButton boton : botones){
			
			boton.setVisible(visibilidad);
		}
	}
	
	/**
	 * Avanza, en caso de haber, a la siguiente vista de categoria de candidatos a seleccionar
	 * */
	public void presentarCategoriaSiguiente() {//PresentarCategoriaSiguiente

		if (candidatos.containsKey(paginaActual + 1)) {
			
			cambiarVisibilidadPagina(paginaActual,false);//oculto pagina de categoria ya seleccionada
			cambiarVisibilidadPagina(paginaActual+1,true);//muestro pagina de siguiente categoria a seleccionar
			
			f.validate();
			f.repaint();
			paginaActual++;
		} 
	}
	
	private void presentarFalla(String imagen) {
		
		JFrame errorFrame = new JFrame();
	
		errorFrame.setTitle("Error");
	
		errorFrame.setBackground(Color.RED);
	
		errorFrame.setSize(1024, 900);
	
		errorFrame.add(new JLabel(new ImageIcon(imagen)));
	
		errorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		errorFrame.setVisible(true);
		
	}

	public void presentarFallaLector() {
		
		presentarFalla(FALLA_LECTOR);
		
	}
	
	public void presentarFallaCarga() {
		
		presentarFalla(FALLA_CARGA);
		
	}

	
	private void setearContraste(int page, List<Candidato> temp)
	{

		int candidatoAct = 0;
		
		while (candidatoAct < temp.size()) 
		   {
			Candidato candidato = temp.get(candidatoAct);
			
		
			candidatos.get(page).get(candidatoAct).setIcon(new ImageIcon(candidato.getRutaImagenContraste()));
            
			
			candidatoAct++;
		}
		
	}
	
	public void presentarContraste(List<List<Candidato>> list) {
		for(int i = 0;i < list.size(); i++){
            
			setearContraste(i,list.get(i));
        }
        
		f.validate();
		f.repaint();
	}

	private void setearNoContraste(int page, List<Candidato> temp)
	{

		int candidatoAct = 0;
		
		while (candidatoAct < temp.size()) 
		   {
			Candidato candidato = temp.get(candidatoAct);
			
		
			candidatos.get(page).get(candidatoAct).setIcon(new ImageIcon(candidato.getRutaImagen()));
            
			
			candidatoAct++;
		}
		
	}
	
	public void presentarNoContraste(List<List<Candidato>> list) {
        
		for(int i = 0;i < list.size(); i++){
            
			setearNoContraste(i,list.get(i));
        }
        
		f.validate();
		f.repaint();
		
	}
}
